package cn.sh.tools.util;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;

/**
 * @Description ID生成器工具
 * @Classname IdUtils
 * @Date 2023/5/5
 * @Author sh
 **/
public class IdUtils {

    private static volatile Snowflake snowflake;

    private static Snowflake getSnowflake() {
        if (snowflake == null) {
            synchronized (IdUtils.class) {
                if (snowflake == null) {
                    /**
                     * TODO 下面写死的方式在生产上肯定是不可行的，因为不可能同一套代码部署到不同机器上的时候还要再改个代码，那就太扯淡了。
                     * 【可行方案】
                     *      workerId、datacenterId 可以从 redis 中以【全局自增】形式【动态】获取。
                     *  这样的话，就可以保证每个数据中心的每台终端的id都不一样。
                     */
                    //SpringUtil.getBean(RedisTemplate.class)
                    // 终端ID
                    long workerId = 1L;
                    // 数据中心ID（可以理解为是机房ID）
                    long datacenterId = 2L;
                    snowflake = IdUtil.createSnowflake(workerId, datacenterId);
                }
            }
        }
        return snowflake;
    }

    public static long getSnowflakeNextId() {
        return getSnowflake().nextId();
    }

    public static String getSnowflakeNextIdStr() {
        return getSnowflake().nextIdStr();
    }

}
